home *** CD-ROM | disk | FTP | other *** search
/ PCGUIA 127 / PC Guia 127.iso / Software / Utils / GParted Live CD / Bin / gparted-livecd-0.2.2.iso / usr_sqfs / bin / passmass < prev    next >
Encoding:
Text File  |  2005-07-18  |  4.4 KB  |  213 lines

  1. #!/bin/sh
  2. # \
  3. exec expect -- "$0" ${1+"$@"}
  4. # passmass: change password on many machines
  5. # Synopsis: passmass host1 host2 host3 ....
  6. # Don Libes - March 11, 1991
  7.  
  8. # Description: Change passwords on the named machines.
  9. #
  10. # See passmass.man for further info.
  11.  
  12. exp_version -exit 5.0
  13.  
  14. if {$argc==0} {
  15.     send_user "usage: $argv0 host1 host2 host3 . . .\n"
  16.     exit
  17. }
  18.  
  19. expect_before -i $user_spawn_id \003 exit
  20.  
  21. proc badhost {host emsg} {
  22.     global badhosts
  23.  
  24.     send_user "\r\n\007password not changed on $host - $emsg\n\n"
  25.     if {0==[llength $badhosts]} {
  26.     set badhosts $host
  27.     } else {
  28.     set badhosts [concat $badhosts $host]
  29.     }
  30. }
  31.  
  32. # set defaults
  33. set login "rlogin"
  34. set program "passwd"
  35. set user [exec whoami]
  36. set su 0
  37.  
  38. set timeout -1
  39. stty -echo
  40.  
  41. if {!$su} {
  42.     send_user "old password: "
  43.     expect_user -re "(.*)\n"
  44.     send_user "\n"
  45.     set password(old) $expect_out(1,string)
  46.     set password(login) $expect_out(1,string)
  47.     send_user "new password: "
  48.     expect_user -re "(.*)\n"
  49.     send_user "\n"
  50.     set password(new) $expect_out(1,string)
  51.     send_user "retype new password: "
  52.     expect_user -re "(.*)\n"
  53.     set password(newcheck) $expect_out(1,string)
  54.     send_user "\n"
  55. } else {
  56.     send_user "login password: "
  57.     expect_user -re "(.*)\n"
  58.     send_user "\n"
  59.     set password(login) $expect_out(1,string)
  60.     send_user "root password: "
  61.     expect_user -re "(.*)\n"
  62.     send_user "\n"
  63.     set password(old) $expect_out(1,string)
  64.     send_user "new password: "
  65.     expect_user -re "(.*)\n"
  66.     send_user "\n"
  67.     set password(new) $expect_out(1,string)
  68.     send_user "retype new password: "
  69.     expect_user -re "(.*)\n"
  70.     set password(newcheck) $expect_out(1,string)
  71.     send_user "\n"
  72. }
  73.  
  74. stty echo
  75. trap exit SIGINT
  76.  
  77. if ![string match $password(new) $password(newcheck)] {
  78.     send_user "mismatch - password unchanged\n"
  79.     exit
  80. }
  81.  
  82.  
  83. #send_user "want to see new password you just typed? (y|n) "
  84. #expect_user "*\n"
  85. #
  86. #if {[string match "y" [lindex $expect_match 0 c]]} {
  87. #    send_user "password is <$password(new)>\nproceed? (y|n) "
  88. #    expect_user "*\n"
  89. #    if ![string match "y" [lindex $expect_match 0 c]] exit
  90. #}
  91.  
  92. set timeout 30
  93. set badhosts {}
  94. for {set i 0} {$i<$argc} {incr i} {
  95.     set arg [lindex $argv $i]
  96.     switch -- $arg "-user" {
  97.     incr i
  98.     set user [lindex $argv $i]
  99.     continue
  100.     } "-prompt" {
  101.     incr i
  102.     set prompt [lindex $argv $i]
  103.     continue
  104.     } "-rlogin" {
  105.     set login "rlogin"
  106.     continue
  107.     } "-slogin" {
  108.     set login "slogin"
  109.     continue
  110.     } "-telnet" {
  111.     set login "telnet"
  112.     continue
  113.     } "-program" {
  114.     incr i
  115.     set program [lindex $argv $i]
  116.     continue
  117.     } "-timeout" {
  118.     incr i
  119.     set timeout [lindex $argv $i]
  120.     continue
  121.     } "-su" {
  122.     incr i
  123.     set su [lindex $argv $i]
  124.     continue
  125.     }
  126.  
  127.     set host $arg
  128.     if {[string match $login "rlogin"]} {
  129.     set pid [spawn rlogin $host -l $user]
  130.     } elseif {[string match $login "slogin"]} {
  131.     set pid [spawn slogin $host -l $user]
  132.     } elseif {[string match $login "ssh"]} {
  133.     set pid [spawn ssh $host -l $user]
  134.     } else {
  135.     set pid [spawn telnet $host]
  136.     expect -re "(login|Username):.*" {
  137.         send "$user\r"
  138.     }
  139.     }
  140.  
  141.     if ![info exists prompt] {
  142.     if {[string match $user "root"]} {
  143.         set prompt "# "
  144.     } else {
  145.         set prompt "(%|\\\$|#) "
  146.     }
  147.     }
  148.  
  149.     set logged_in 0
  150.     while {1} {
  151.     expect "Password*" {
  152.         send "$password(login)\r"
  153.     } eof {
  154.         badhost $host "spawn failed"
  155.         break
  156.     } timeout {
  157.         badhost $host "could not log in (or unrecognized prompt)"
  158.         exec kill $pid
  159.         expect eof
  160.         break
  161.     } -re "incorrect|invalid" {
  162.         badhost $host "bad password or login"
  163.         exec kill $pid
  164.         expect eof
  165.         break
  166.     } -re $prompt {
  167.         set logged_in 1
  168.         break
  169.     }
  170.     }
  171.  
  172.     if (!$logged_in) {
  173.     wait
  174.     continue
  175.     }
  176.  
  177.     if ($su) {
  178.     send "su -\r"
  179.     expect "Password:"
  180.     send "$password(old)\r"
  181.     expect "# "
  182.     send "$program root\r"
  183.     } else {
  184.     send "$program\r"
  185.     }
  186.  
  187.     expect "Old password*" {
  188.     send "$password(old)\r"
  189.     expect "Sorry*" {
  190.         badhost $host "old password is bad?"
  191.         continue
  192.     } "password:"
  193.     } -re "(n|N)ew password:"
  194.     send "$password(new)\r"
  195.     expect -re "not changed|unchanged" {
  196.     badhost $host "new password is bad?"
  197.     continue
  198.     } -re "(password|Verification|Verify|again):.*"
  199.     send "$password(new)\r"
  200.     expect -re "(not changed|incorrect|choose new).*" {
  201.     badhost $host "password is bad?"
  202.     continue
  203.     } -re "$prompt"
  204.     send_user "\n"
  205.  
  206.     close
  207.     wait
  208. }
  209.  
  210. if {[llength $badhosts]} {
  211.     send_user "\nfailed to set password on $badhosts\n"
  212. }
  213.